package api

import (
	"fmt"
	"service/app/control"
	"service/app/dto"
	"service/app/mode"

	"github.com/gin-gonic/gin"
)

var (
	ROLECREATE     = 400001
	ROLELIST       = 400002
	UPDATAROLELIST = 400003
	RoleAndUsers   = 400004
	ROLESBYUSERID  = 400005
	ROLESPERM      = 400006
	ROLEUPDATAPERM = 400007
	ROLEGETPERM    = 400008
)

type RoleApi struct {
	BaseApi
	Contr *control.RoleControl
}

func RoleApiCreate() RoleApi {
	return RoleApi{
		BaseApi: *BaseApi{}.BaseApiInit(),
		Contr:   control.RoleControlInit(),
	}
}

// @Summary 更新角色perm列表
// @Description 更新角色perm列表 permList[]数字格式
// @Tags role
// @Param object body dto.ReqUriIdDto true "permList []数字格式"
// @Router /api/v1/role/perm/{id} [PUT]
// @Security ApiKeyAuth
func (m RoleApi) RoleUpdataPerm(ctx *gin.Context) {
	var roleId dto.ReqUriIdDto
	var permList dto.Ipm_pmIntList
	if err := m.BaseReqHandle(&IBaseApiParams{ReqUri: true, Ctx: ctx, Dto: &roleId}).GetBaseErr(); err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	if err := m.BaseReqHandle(&IBaseApiParams{Ctx: ctx, Dto: &permList}).GetBaseErr(); err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	list, err := m.Contr.RoleUpdataPermC(&roleId, &permList)
	if err != nil {
		m.Fail(ResponseJson{Msg: err.Error(), Code: ROLEUPDATAPERM})
		return
	}
	m.Okay(ResponseJson{Msg: fmt.Sprintf("更新角色 %v perm列表!", roleId.Id), Data: &list})
}

// @Summary 获取指定角色permList
// @Description 登录时被调用
// @Tags role
// @Router /api/v1/role/perm/{id} [GET]
// @Security ApiKeyAuth
func (m RoleApi) Role_permList(ctx *gin.Context) {
	var roleId dto.ReqUriIdDto
	if err := m.BaseReqHandle(&IBaseApiParams{Ctx: ctx, Dto: &roleId, Valid: true, ReqUri: true}).GetBaseErr(); err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	rolePermList, err := m.Contr.Role_permListC(&roleId)
	if err != nil {
		m.Fail(ResponseJson{Msg: err.Error(), Code: ROLEGETPERM})
		return
	}
	m.Okay(ResponseJson{Msg: fmt.Sprintf("获取角色：%v menus列表成功!", roleId.Id), Data: rolePermList})
}

// @Summary 获取当前用户permList
// @Description 登录时被调用
// @Tags role
// @Router /api/v1/role/current [GET]
// @Security ApiKeyAuth
func (m RoleApi) RoleCurrent(ctx *gin.Context) {
	m.Ctx = ctx
	profile := m.GetCtxUser()
	var permlist []mode.Db_pm
	for _, v := range profile.Roles {
		permlist = m.Contr.Dao.RmMenuduplicates(permlist, v.Perm)
	}
	m.Okay(ResponseJson{Msg: "获取当前用户permList成功!", Data: permlist})
}

// @Summary 从roles列表获取可访问列表
// @Tags role
// @Description 从角色列表中获取权限列表, roles非[]int
// @Router /api/v1/role/r_perm [post]
// @Param object body dto.RoleAdd true "角色"
// @Security ApiKeyAuth
func (m RoleApi) Roles_R_Perm(ctx *gin.Context) {
	var roleList dto.IroleUdataList
	if err := m.BaseReqHandle(&IBaseApiParams{Ctx: ctx, Dto: &roleList, Valid: true}).GetBaseErr(); err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	list, err := m.Contr.RolesPermC(&roleList)
	if err != nil {
		m.Fail(ResponseJson{Msg: err.Error(), Code: ROLESPERM})
		return
	}
	m.Okay(ResponseJson{Msg: "从roles列表获取可访问列表成功!", Data: list})
}

// @Summary 创建角色
// @Tags role
// @Description
// @Router /api/v1/role [post]
// @Param object body dto.RoleAdd true "角色"
// @Security ApiKeyAuth
func (m RoleApi) RoleCreate(ctx *gin.Context) {
	var params dto.RoleAdd
	if err := m.BaseReqHandle(&IBaseApiParams{Ctx: ctx, Dto: &params, Valid: true}).GetBaseErr(); err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	if err := m.Contr.RoleAddC(&params); err != nil {
		m.Fail(ResponseJson{Msg: err.Error(), Code: ROLECREATE})
		return
	}

	m.Okay(ResponseJson{Msg: fmt.Sprintf("创建角色：%v 成功!", params.Name)})
}

// @Tags role
// @Summary 角色列表角色
// @Description
// @Router /api/v1/role [get]
// @Security ApiKeyAuth
func (m RoleApi) RoleList(ctx *gin.Context) {
	m.Ctx = ctx
	list, err := m.Contr.RoleListC()
	if err != nil {
		m.Fail(ResponseJson{Code: ROLELIST, Msg: err.Error()})
		return
	}
	m.Okay(ResponseJson{Msg: "获取角色列表成功!", Data: list})
}

// @Summary 用户更新角色列表
// @Tags role
// @Description 角色列表以数字 [1]
// @Router /api/v1/role/relation_user/{id} [post]
// @Param  id path  int  true  "userid ID"
// @Param object body dto.IRolesList true "角色ID切片"
// @Security ApiKeyAuth
func (m RoleApi) RolesRelation_user(ctx *gin.Context) {
	var rolesList dto.IRolesList
	var userId dto.ReqUriIdDto
	if err := m.BaseReqHandle(&IBaseApiParams{Ctx: ctx, Dto: &rolesList, Valid: true}).GetBaseErr(); err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	if err := m.BaseReqHandle(&IBaseApiParams{Ctx: ctx, Dto: &userId, ReqUri: true, Valid: true}).GetBaseErr(); err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	if err := m.Contr.RolesRelation_userC(&userId, &rolesList); err != nil {
		m.Fail(ResponseJson{Code: UPDATAROLELIST, Msg: err.Error()})
	}
	m.Okay(ResponseJson{Msg: fmt.Sprintf("用户ID:%v 更新角色列表!", int(userId.Id))})
}

// @Tags role
// @Summary 用户ID获取角色
// @Description
// @Router /api/v1/userid/{id} [get]
// @Param id path dto.ReqUriIdDto true "userid ID"
// @Security ApiKeyAuth
func (m RoleApi) RolesById(ctx *gin.Context) {
	var userid dto.ReqUriIdDto
	if err := m.BaseReqHandle(&IBaseApiParams{Ctx: ctx, Dto: &userid, ReqUri: true, Valid: true}).GetBaseErr(); err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	list, err := m.Contr.Role_userId_getC(userid.Id)
	if err != nil {
		m.Fail(ResponseJson{Msg: err.Error(), Code: ROLESBYUSERID})
		return
	}
	m.Okay(ResponseJson{Data: list})
}

// @Summary 获取api 列表  pagination
// @Tags role
// @Description
// @Router /api/v1/role/users [get]
// @Param page query int true "页码" default(1)
// @Param limit query int true "每页数量" default(10)
// @Param keyword query string false "关键字"
// @Param order query string  false "排序" Enums(ASC,DESC)
// @Security ApiKeyAuth
func (m RoleApi) RoleAndUsers(ctx *gin.Context) {
	var pageOpt dto.ReqPaginat
	err := m.BaseReqHandle(&IBaseApiParams{Ctx: ctx, Dto: &pageOpt, ReqQey: true, Valid: true}).GetBaseErr()
	if err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	userList, total, err := m.Contr.RoleAndUsersC(&pageOpt)
	if err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	m.Okay(ResponseJson{Msg: "用户与权限列表获取成功!", Data: userList, Total: total})
}
